﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLLEP.Funcionalidad
{
    public class BLLUsuario:BLLGenerico
    {
        public BLLUsuario(EstacionDePoderDataContext contexto) : base(contexto) { }
        public BLLUsuario() : this(new EstacionDePoderDataContext()) { }

        public void CrearUsuario(string email, string contraseña, string emailReferido, string ipCliente)
        {
            if (Traer(email) != null)
                throw new BLLEPException("E-mail " + email + " está siendo utilizado por otra cuenta");
            if(emailReferido != null && Traer(emailReferido) == null)
                throw new BLLEPException("E-mail de referido " + email + "no pertenece a ninguna cuenta");
            if(contraseña.Length <6)
                throw new BLLEPException("La contraseña debe poseer al menos 6 caracteres");

            EP_Usuario usuario = new EP_Usuario();
            usuario.Email = email;
            usuario.Contraseña = Encriptador.Encriptar(contraseña);
            usuario.Habilitado = false;
            Contexto.EP_Usuarios.InsertOnSubmit(usuario);

            if (emailReferido != null)
            {
                BLLReferencia bllReferencia = new BLLReferencia(Contexto);
                bllReferencia.CrearReferencia(TraerHabilitado(emailReferido), usuario);
            }

            BLLRol bllRol = new BLLRol(Contexto);
            bllRol.AsignarRolesPorDefecto(usuario);

            BLLActividadUsuario bllActividadUsuario = new BLLActividadUsuario(Contexto);
            bllActividadUsuario.RegistrarCreacionCuenta(usuario, ipCliente);
        }

        public EP_Usuario TraerHabilitado(string email)
        {
            return Contexto.EP_Usuarios.Where(e => e.Habilitado == true && e.Email.ToLower().Equals(email.ToLower())).FirstOrDefault();
        }

        public EP_Usuario Traer(string email)
        {
            return Contexto.EP_Usuarios.Where(e => e.Email.ToLower().Equals(email.ToLower())).FirstOrDefault();
        }

        public EP_Usuario Traer(int id)
        {
            return Contexto.EP_Usuarios.Where(e => e.IdUsuario == id).FirstOrDefault();
        }

        public bool ValidarLogin(string email, string contraseña, string ipCliente)
        {
            try
            {
                EP_Usuario usuario = TraerHabilitado(email);
                if (usuario == null)
                    return false;

                string contraseñaDesencriptada = Encriptador.Desencriptar(usuario.Contraseña);

                bool acceso = contraseña.Equals(contraseñaDesencriptada);

                if (ipCliente != null && acceso)
                {
                    BLLActividadUsuario bllActividadUsuario = new BLLActividadUsuario(Contexto);
                    bllActividadUsuario.RegistrarAccesoCuenta(usuario, ipCliente);
                    bllActividadUsuario.GuardarCambios();
                }

                return acceso;
            }
            catch (Exception ex) { }

            return false;
        }

        public void CambiarContraseña(string email, string nuevaContraseña)
        {
            if (nuevaContraseña.Length < 6)
                throw new BLLEPException("La contraseña debe poseer al menos 6 caracteres");

            EP_Usuario usuario = Traer(email);
            usuario.Contraseña = Encriptador.Encriptar(nuevaContraseña);
        }

    }
}
